#!/bin/sh /etc/rc.common

START=99
USE_PROCD=1
PROG=/usr/bin/alist

get_config() {
	config_get_bool enabled $1 enabled 1
	config_get port $1 port 5244
	config_get log $1 log 1
	config_get site_url $1 site_url ""
	config_get data_dir $1 data_dir "/etc/alist"
	config_get temp_dir $1 temp_dir "/tmp/alist"
	config_get ssl $1 ssl 0
	config_get ssl_cert $1 ssl_cert ""
	config_get ssl_key $1 ssl_key ""
	config_get token_expires_in $1 token_expires_in 48
	config_get allow_wan $1 allow_wan 0
	config_get max_connections $1 max_connections 0
	config_get delayed_start $1 delayed_start 0

	# mysql
	config_get mysql $1 mysql 0
	config_get mysql_host $1 mysql_host ""
	config_get mysql_port $1 mysql_port "3306"
	config_get mysql_username $1 mysql_username ""
	config_get mysql_password $1 mysql_password ""
	config_get mysql_database $1 mysql_database ""

	config_load network
	config_get lan_addr lan ipaddr "0.0.0.0"
	if echo "${lan_addr}" | grep -Fq ' '; then
		lan_addr="0.0.0.0"
	else
		lan_addr=${lan_addr%%/*}
	fi
}

set_firewall() {
	if [ "$external_access" = "allow" ]; then
		uci -q delete firewall.alist
		uci set firewall.alist=rule
		uci set firewall.alist.name="alist"
		uci set firewall.alist.target="ACCEPT"
		uci set firewall.alist.src="wan"
		uci set firewall.alist.proto="tcp"
		uci set firewall.alist.dest_port="$port"
		uci set firewall.alist.enabled="1"
		uci commit firewall
		/etc/init.d/firewall reload >/dev/null 2>&1
	elif [ "$external_access" = "deny" ]; then
		uci -q delete firewall.alist
		uci commit firewall
		/etc/init.d/firewall reload >/dev/null 2>&1
	fi
}

start_service() {
	config_load alist
	config_foreach get_config alist
	[ $enabled -ne 1 ] && return 1
	mkdir -p $temp_dir $data_dir
	[ "$ssl" -eq 1 ] && https_port=$port http_port="-1" || https_port="-1" http_port=$port
	[ "$log" -eq 1 ] && log=true || log=false
	if [ -e /proc/uptime ]; then
		[ $(awk -F. '{print $1}' /proc/uptime) -lt "120" ] && delayed_start=$delayed_start || delayed_start=0
	else
		delayed_start=$delayed_start
	fi
	if [ "$allow_wan" -eq "1" ]; then
		listen_addr="0.0.0.0"
		external_access="allow"
	else
		listen_addr=$lan_addr
		external_access="deny"
	fi
	# mysql
	[ "$mysql" -eq 1 ] && database=mysql || database=sqlite3
	set_firewall
	true > $temp_dir/alist.log
	cat > $data_dir/config.json <<EOF
{
  "force": false,
  "site_url": "$site_url",
  "cdn": "",
  "jwt_secret": "",
  "token_expires_in": $token_expires_in,
  "database": {
    "type": "$database",
    "host": "$mysql_host",
    "port": $mysql_port,
    "user": "$mysql_username",
    "password": "$mysql_password",
    "name": "$mysql_database",
    "db_file": "$data_dir/data.db",
    "table_prefix": "x_",
    "ssl_mode": ""
  },
  "scheme": {
    "address": "$listen_addr",
    "http_port": $http_port,
    "https_port": $https_port,
    "force_https": false,
    "cert_file": "$ssl_cert",
    "key_file": "$ssl_key",
    "unix_file": "/var/alist.sock"
  },
  "temp_dir": "$temp_dir",
  "bleve_dir": "$data_dir/bleve",
  "log": {
    "enable": $log,
    "name": "$temp_dir/alist.log",
    "max_size": 10,
    "max_backups": 5,
    "max_age": 28,
    "compress": false
  },
  "delayed_start": $delayed_start,
  "max_connections": $max_connections,
  "tls_insecure_skip_verify": true
}
EOF

	procd_open_instance alist
	procd_set_param command $PROG
	procd_append_param command server --data $data_dir
	procd_set_param stdout 1
	procd_set_param stderr 1
	procd_set_param respawn
	procd_close_instance alist
}

service_triggers() {
	procd_add_reload_trigger "alist"
}

stop_service() {
	external_access="deny"
	set_firewall
}

reload_service() {
	stop
	sleep 1
	start
}
